// 文件名：multimap_http_headers.cpp
// 目的：演示使用 std::multimap 存储与操作可能重复的 HTTP 头字段。
// 核心要点：
//   - HTTP 头如 Set-Cookie、Accept 可能出现多次，multimap 允许同键多值；
//   - equal_range(name) 返回键为 name 的半开区间 [begin,end) 以便统一遍历；
//   - erase(key) 一次性删除该键的所有条目；
//   - emplace 可追加同名头；
//   - 打印逻辑：将一个名字对应的多个值按逗号连接输出（演示用，真实协议需按规范处理，比如 Set-Cookie 不合并输出）。
// 注意：
//   - HTTP 头大小写不敏感，生产代码可使用不区分大小写的比较器或统一大小写存储。
//   - 对于可能需要保持输入顺序的场景，multimap 在“等价键”之间的相对顺序通常等于插入顺序，但标准未强制稳定性。

#include <iostream>
#include <map>
#include <string>

int main() {
    // 初始化多值头集合：同名键可出现多次
    std::multimap<std::string, std::string> headers = {
        {"Content-Type", "text/html"},
        {"Set-Cookie", "session=abc; Path=/"},
        {"Set-Cookie", "theme=light; Path=/"},
        {"Cache-Control", "no-cache"},
        {"Accept", "text/html"},
        {"Accept", "application/json"}
    };

    // 工具函数：打印指定名称的头部（将多值以逗号分隔）
    auto printHeader = [&](const std::string& name) {
        auto [begin, end] = headers.equal_range(name); // O(log N) 定位区间
        std::cout << name << ": ";
        if (begin == end) {
            std::cout << "(none)\n";
            return;
        }
        bool first = true;
        for (auto it = begin; it != end; ++it) {
            if (!first) std::cout << ", ";
            std::cout << it->second;
            first = false;
        }
        std::cout << '\n';
    };

    printHeader("Set-Cookie");
    printHeader("Accept");

    // 删除所有 Set-Cookie 头（全部同键条目）
    headers.erase("Set-Cookie");
    printHeader("Set-Cookie");

    // 增加一个新的 Accept 值并按范围遍历打印
    headers.emplace("Accept", "application/xml");
    printHeader("Accept");
    return 0;
}